#ifndef REFLEX_H
#define REFLEX_H

#include <string>
#include "task/abstract_task.h"

#define REGISTER_TASK_TYPE(class) reflex::TaskReflexManager::registerTaskType<class>(#class);
#define UNREGISTER_TASK_TYPE(class) reflex::TaskReflexManager::unregisterTaskType<class>(#class);

namespace reflex
{
using task_type = std::function<std::shared_ptr<task::AbstractTask>(const std::string &)>;
class TaskReflexManager
{
public:
    /**
     * @brief:  注册任务类型
     * @author: sherlock_lht
     */
    template<class T>
    static void registerTaskType(const std::string &type_name);

    /**
     * @brief:  取消指定类型的注册，如果未注册，则忽略
     * @author: sherlock_lht
     */
    template<class T>
    static void unregisterTaskType(const std::string &type_name);

    /**
     * @brief:  检查指定类型是否被注册，使用registerTaskType接口注册类型
     * @note:   true: 已经注册过; false: 未注册
     * @author: sherlock_lht
     */
    static bool isTypeRegistered(const std::string &type_name);

    /**
     * @brief:  根据task类型和名称构造task对象
     * @author: sherlock_lht
     */
    static task::AbstractTaskConstPtr constructTask(const std::string &type_name, const std::string &task_name);

private:
    TaskReflexManager();

    static void saveType(const std::string &type_name, const task_type &type_construction);
    static void removeType(const std::string &type_name);
};
}

#include "reflex.inl"
#endif //REFLEX_H
